package com.hwpt.hwaccount.core.data.repository;

import android.content.Context;
import androidx.datastore.preferences.core.Preferences;
import androidx.datastore.preferences.rxjava3.RxPreferenceDataStoreBuilder;
import androidx.datastore.rxjava3.RxDataStore;
import com.hwpt.hwaccount.core.data.local.database.UserInfoDB;
import com.hwpt.hwaccount.core.data.local.dao.UserDao;
import com.hwpt.hwaccount.core.data.local.entity.UserEntity;
import com.hwpt.hwaccount.core.utils.CoroutineUtils;


import java.util.List;

import io.reactivex.rxjava3.core.Completable;
import io.reactivex.rxjava3.core.Single;
import io.reactivex.rxjava3.schedulers.Schedulers;

/**
 * 描述：账户数据仓库类，负责统一管理用户数据的存取操作
 * 整合了Room数据库和DataStore偏好设置两种数据源
 * 使用RxJava3实现异步操作和线程调度
 * 作者：Mr.高
 * 日期：2025/8/20
 */

public class UserInfoRepository {
    private final UserDao userDao;       // Room数据库的用户数据访问对象
    private final RxDataStore<Preferences> dataStore;  // RxJava3封装的偏好设置存储

    /**
     * 构造方法，初始化数据库和偏好设置存储
     * @param context Android上下文，用于构建数据库实例
     */
    public UserInfoRepository(Context context) {
        UserInfoDB database = UserInfoDB.getInstance(context);
        this.userDao = database.userDao();
        this.dataStore = new RxPreferenceDataStoreBuilder(context, "account_prefs").build();
    }


    /**
     * 插入新用户到数据库
     * @param user 要插入的用户实体对象
     * @return 表示操作完成的Completable对象
     */
    public Completable insertUser(UserEntity user) {
        return userDao.insertUser(user)
                .subscribeOn(Schedulers.from(CoroutineUtils.ioExecutor()));
    }

    /**
     * 更新用户头像
     * @param accountId 用户账号ID
     * @param avatarUrl 头像URL
     * @return 表示操作完成的Completable对象
     */
    public Completable updateAvatar(String accountId, String avatarUrl) {
        return userDao.updateAvatar(accountId, avatarUrl)
                .subscribeOn(Schedulers.from(CoroutineUtils.ioExecutor()));
    }

    /**
     * 设置用户登录状态（示例方法，实际未完整实现）
     * @param loggedIn 是否已登录
     * @return 表示操作完成的Completable对象
     */
    public Completable setLoggedIn(boolean loggedIn) {
        return Completable.fromAction(() -> {
                    // 这里简化处理，实际应该使用DataStore保存登录状态
                    // 示例代码中暂未实现具体逻辑
                })
                .subscribeOn(Schedulers.from(CoroutineUtils.ioExecutor()));
    }

    /**
     * 清空用户表（示例方法，实际使用时需谨慎）
     * @return 表示操作完成的Completable对象
     */
    public Completable clearUserTable() {
        return Completable.fromAction(() -> {
            userDao.deleteAllUsers(); // 清空 users 表
        });
    }

    /**
     * 获取所有用户（示例方法，实际使用时需谨慎）
     * @return 包含所有用户实体对象的Single列表
     */
    public Single<List<UserEntity>> getAllUsers() {
        return userDao.getAllUsers()
                .subscribeOn(Schedulers.from(CoroutineUtils.ioExecutor()));
    }
}